// 文件名：multimap_event_dispatch.cpp
// 目的：实现一个基于 std::multimap 的事件总线（EventBus），支持为同一事件注册多个监听器并广播。
// 关键点：
//   - registerListener(event, listener)：将事件名映射到回调函数（允许同键多值）；
//   - emit(event, payload)：通过 equal_range(event) 获取该事件的所有监听器并逐一调用；
//   - Listener 类型为 std::function<void(int)>，以演示带载荷的回调。
// 说明：
//   - multimap 以键排序存储监听器；多个同名事件的监听器一起存放，equal_range 可一次性遍历；
//   - 若需移除某个特定监听器，可存储可比较的句柄或使用唯一 ID 来定位；
//   - 本示例为单线程演示；并发环境需同步或使用无锁结构。
#include <functional>
#include <iostream>
#include <map>
#include <string>

class EventBus {
public:
    using Listener = std::function<void(int)>;

    // 注册监听器：同一事件可注册多个监听器
    void registerListener(std::string event, Listener listener) {
        listeners_.emplace(std::move(event), std::move(listener));
    }

    // 广播事件：调用所有匹配事件名的监听器
    void emit(const std::string& event, int payload) const {
        auto [begin, end] = listeners_.equal_range(event);
        for (auto it = begin; it != end; ++it) {
            it->second(payload); // 触发回调
        }
    }

private:
    std::multimap<std::string, Listener> listeners_;
};

int main() {
    EventBus bus;
    // UI 订阅温度更新
    bus.registerListener("temperature", [](int value) {
        std::cout << "[UI] Temperature updated: " << value << "°C\n";
    });
    // 警报模块订阅温度并判断阈值
    bus.registerListener("temperature", [](int value) {
        if (value > 30) std::cout << "[Alert] High temperature!\n";
    });
    // 记录湿度
    bus.registerListener("humidity", [](int value) {
        std::cout << "[Logger] Humidity: " << value << "%\n";
    });

    // 发送事件：触发所有同名监听器
    bus.emit("temperature", 28);
    bus.emit("temperature", 35);
    bus.emit("humidity", 60);
    return 0;
}